STAT2 : STATISTIQUE DESCRIPTIVE

Exo2 : Résumer une variable

Auteur·rice

Jean-Paul N’GBESSO & Claude GRASLAND

Date de publication

2025-05-27

Télécharger l’exercice

Exploration I (var. quali.)

Sélection et recodage

Les variables qualitatives nominales ou factor sont des objets composés d’une liste de numéros et d’une liste d’étiquettes.

don<-read.table(file = "data/africa_pays_2018/data/africa_pays_2018.csv",
           header=TRUE,
           sep = ";",
           dec = ",",
           encoding = "UTF-8")

# Extraction de la variable
X<-don$LANGFR
X
 [1] 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1
[39] 0 0 0 1 1 1 0 0 0 0 0
# Vérification du type
str(X)
 int [1:49] 0 1 1 1 0 1 1 1 1 1 ...

Si la variable chargée est de type character il faut la transformer avec as.factor() et repérer les niveaux disponibles avec levels()

X<-as.factor(X)
class(X)
[1] "factor"
levels(X)
[1] "0" "1"

On peut remplacer les niveaux en utilisant l’instruction levels()à nouveau, mais suivie d’un vecteur de charactères indiquant les changements de nom.

levels(X)<-c("non francophone","francophone")
             
X
 [1] non francophone francophone     francophone     francophone    
 [5] non francophone francophone     francophone     francophone    
 [9] francophone     francophone     francophone     francophone    
[13] non francophone non francophone non francophone francophone    
[17] non francophone francophone     non francophone non francophone
[21] francophone     non francophone non francophone non francophone
[25] non francophone francophone     francophone     francophone    
[29] non francophone non francophone non francophone non francophone
[33] francophone     non francophone francophone     non francophone
[37] non francophone francophone     non francophone non francophone
[41] non francophone francophone     francophone     francophone    
[45] non francophone non francophone non francophone non francophone
[49] non francophone
Levels: non francophone francophone
str(X)
 Factor w/ 2 levels "non francophone",..: 1 2 2 2 1 2 2 2 2 2 ...

On peut transformer une variable quantitative en facteur avec la fonction cut()

summary(don$POP)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    4.90   15.20   26.27   30.10  198.40 
Y<-cut(don$POP, breaks=c(0,10,30,200))
Y
 [1] (30,200] (10,30]  (10,30]  (10,30]  (0,10]   (0,10]   (10,30]  (10,30] 
 [9] (30,200] (0,10]   (0,10]   (30,200] (30,200] (0,10]   (30,200] (0,10]  
[17] (30,200] (10,30]  (0,10]   (0,10]   (0,10]   (30,200] (0,10]   (0,10]  
[25] (0,10]   (30,200] (10,30]  (10,30]  (10,30]  (0,10]   (10,30]  (0,10]  
[33] (10,30]  (30,200] (10,30]  (30,200] (10,30]  (10,30]  (0,10]   (10,30] 
[41] (0,10]   (10,30]  (0,10]   (10,30]  (30,200] (30,200] (30,200] (10,30] 
[49] (10,30] 
Levels: (0,10] (10,30] (30,200]
str(Y)
 Factor w/ 3 levels "(0,10]","(10,30]",..: 3 2 2 2 1 1 2 2 3 1 ...

On peut ensuite recoder les classes avec levels()

levels(Y)<-c("Petit","Moyen","Grand")
Y
 [1] Grand Moyen Moyen Moyen Petit Petit Moyen Moyen Grand Petit Petit Grand
[13] Grand Petit Grand Petit Grand Moyen Petit Petit Petit Grand Petit Petit
[25] Petit Grand Moyen Moyen Moyen Petit Moyen Petit Moyen Grand Moyen Grand
[37] Moyen Moyen Petit Moyen Petit Moyen Petit Moyen Grand Grand Grand Moyen
[49] Moyen
Levels: Petit Moyen Grand
str(Y)
 Factor w/ 3 levels "Petit","Moyen",..: 3 2 2 2 1 1 2 2 3 1 ...

Table de dénombrement

Pour dénomber une variable qualitative, on utilise l’instruction table() qui crée un objet particulier qui n’est ni un data.frame, ni une matrix.

tab<-table(X)
tab
X
non francophone     francophone 
             27              22 
str(tab)
 'table' int [1:2(1d)] 27 22
 - attr(*, "dimnames")=List of 1
  ..$ X: chr [1:2] "non francophone" "francophone"

On peut créer des tables à 2, 3 ou 4 dimensions

tab2<-table(X,Y)
tab2
                 Y
X                 Petit Moyen Grand
  non francophone    11     6    10
  francophone         6    13     3
str(tab2)
 'table' int [1:2, 1:3] 11 6 6 13 10 3
 - attr(*, "dimnames")=List of 2
  ..$ X: chr [1:2] "non francophone" "francophone"
  ..$ Y: chr [1:3] "Petit" "Moyen" "Grand"

Un objet de type table peut être manipulé par des fonctions spéciales comme addmargins() quii rajoute des sommes en ligne (et en colonne si la table est de dimension 2)

addmargins(tab)
X
non francophone     francophone             Sum 
             27              22              49 
addmargins(tab2)
                 Y
X                 Petit Moyen Grand Sum
  non francophone    11     6    10  27
  francophone         6    13     3  22
  Sum                17    19    13  49

Les objets de type table sont souvent la source de crises de nerf de la part des étudiants qui les confondent avec des objets de type vecteur, matrice ou data.frame. Il existe des fonctions de conversion d’un type vers un autre mais leur emploi n’est pas très simple.

On retiendra donc dans l’immédiat que les résultats de l’instruction tablesont des objets transitoires qui servent uniquement à afficher des résultats ou produire des graphiques à l’aide des instructions plot() ou barplot().

Graphique avec plot()

La fonction plot() s’applique à la plupart de objets R. Elle produit des résultats différents selon le type d’objet qu’elle a identifié. Si on l’applique à un vecteur de type factor on obtient un diagramme en bâtons (à ne pas confondre avec un histogramme)

plot(Y)

On peut améliorer le graphique en lui ajoutant des paramètres c’est-à-dire des instructions séparées par des virgules. Le retour à la ligne après chaque paramètre n’est pas obligatoire mais il est recommandé car il rend le code plus clair.

plot(Y,
     col=c("green", "yellow","orange"), 
     main= "Les pays d'Afrique",
     xlab = "Taille", 
     ylab = "Nombre de pays")

Exploration II (var. quanti)

Résumés numériques

Une variable numérique peut faire l’objet d’un ensemble de résumés statistiques à l’aide de fonctions élémentaires

  • min() : minimum
  • max() : maximum
  • mean() : moyenne
  • sd() : écart-type (en anglais : standard deviation, soit sd en abrégé)
  • sum() : somme
X <- don$MORINF
min(X)
[1] 10.2
max(X)
[1] 84.5
mean(X)
[1] 45.32041
sd(X)
[1] 17.77484

Pour calculer les quantiles on peut utiliser la fonction quantile() en paramétrant la valeur de fréquence cumulée ascendante

  • quantile(X,0) : minimum
  • quantile(X,0.10) : D1 (premier décile)
  • quantile(X,0.25) : Q1 (premier quartile)
  • quantile(X,0.5) : Q2 (médiane)
  • quantile(X,0.75) : Q3 (troisième quartile)
  • quantile(X,0.90) : D9 (dernier décile)
  • quantile(X,1) : maximum
X<-don$MORINF
quantile(X,0.5)
 50% 
42.1 
sel<-c(0,0.25,0.5,0.75,1)
quantile(X,sel)
  0%  25%  50%  75% 100% 
10.2 32.7 42.1 59.4 84.5 
sel<-c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
quantile(X,sel)
   0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
10.20 25.62 31.02 34.30 38.36 42.10 49.64 53.80 62.24 68.84 84.50 

Il peut arriver qu’une fonction soit manquante dans R, comme par exemple le coefficient de variation. Dans ce cas, on peut faire le calcul par des lignes de code ou créer sa propre fonction avec l’instruction function(). La fonction qui est stockée en mémoire apparaît dans la fenêtre Environnement. Lorsqu’on a créé plusieurs fonctions, on peut en faire un programme R qu’on charge en mémoire au début de chaque session. A plus long terme, on peut en faire un package qu’on partagera avec les autres utilisateurs de R.

A titre d’exemple, nous créons une fonction cv() qui calcule le rapport entre l’écart-type et la moyenne d’une distribution :

# lignes de code
X <- don$MORINF
sd(X)/mean(X)
[1] 0.3922039
# fonction
cv<-function(var) {sd(var)/mean(var)}
cv(X)
[1] 0.3922039

Dénombrement

Une variable quantitative peut être discrétisée avec cut(). Elle devient alors un facteur qu’on peut dénomber avec table() puis visualiseer avec plot() sous la forme de diagramme en bâtons.

summary(X)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.20   32.70   42.10   45.32   59.40   84.50 
X<-cut(don$MORINF, c(10,25,40,55,70,85))
str(X)
 Factor w/ 5 levels "(10,25]","(25,40]",..: 3 3 4 3 2 5 4 3 4 2 ...
table(X)
X
(10,25] (25,40] (40,55] (55,70] (70,85] 
      5      17      14       8       5 
plot(X, col=c("green","yellow","orange","red","brown"),
     main = "PIB/hab. en 2018", xlab = "classes")

Boîte à moustaches

La fonction boxplot() permet de visualiser une distribution sous forme de boîte à moustache où l’on repère facilement :

  • la médiane
  • les quartiles Q1 et Q3
  • le minimum et le maximum
  • les valeurs extrêmes situées à une distance supéreiure à 1.5 x (Q3-Q1) de la médiane

La syntaxe de base est la suivante :

X<-don$MORINF
boxplot(X)

Mais on peut améliorer la figure avec quelques paramètres de plus

boxplot(X,horizontal = TRUE, col = "gray80",
        main = "Mortalité infantile en 2018",
        xlab = "Décès pour 1000 naissances")

Histogramme

Dans le cas d’une variable quantitative continue, la visualisation la plus logique est l’histogramme que l’on peut tracer avec la fonction hist(). Celle-ci comporte de nombreux paramètres que l’on peut visualiser dans la fenêtre Help qui se trouve en bas à gauche de R-studio :

Comme d’habitude, on peut appliquer la syntaxe la plus simple :

X<-don$MORINF
hist(X)

On peut ensuite améliorer avec l’ajout de titres et un choix précis de classes. On remarque que si les classes sont d’amplitudes inégales R utilise la densité de probabilité (rapport entre effectif et amplitude de la classe) et non plus l’effectif ce qui est statistiquement correct (et que ne fait pas Excel …).

hist(X, 
     breaks = c(10, 20, 30,40,50, 60,90), 
     col= "lightyellow",
     main = "Mortalité infantile en 2018",
     ylab = "Densité de probabilité", 
     xlab = "Décès pour 1000 naissances")

On peut également ajouter une courbe lissée de la distribution avec les fonctions lines() etdensity()en indiquant la portée du lissage à l'aide du paramètrebw(*band width*) qui est exprimé dans l'unité de mesure de X. On peut aussi ajouter un diagramme de distribution avec la fonctionrug()`

hist(X, 
     breaks = c(10, 20, 30,40,50, 60,90), 
     col= "lightyellow",
     main = "Mortalité infantile en 2018",
     ylab = "Densité de probabilité", 
     xlab = "Décès pour 1000 naissances")
lines(density(X),col="red",lwd=2)
rug(X, col="blue",lwd=2)

Exploration III (2 variables)

Nous verrons en détail dans les chapitres suivants comment croiser deux variables d’un point de vue statistiques. Mais on peut déjà indiquer brièvement comment les visualiser rapidement à l’aide de trois exemples.

Deux variables qualitatives

  • Tableau de contingence
X <- as.factor(don$LANGFR)
levels(X)<-c("non francophone", "francophone")
Y<-cut(don$POP, breaks=c(0,10,20,200))
levels(Y) <- c("petit","moyen","grand")
tab<-table(X,Y)
addmargins(tab)
                 Y
X                 petit moyen grand Sum
  non francophone    11     5    11  27
  francophone         6     9     7  22
  Sum                17    14    18  49
  • Graphique
plot(tab, col=c("yellow","orange","brown"))

  • Test (Chi-2)
test<-chisq.test(X,Y)
test

    Pearson's Chi-squared test

data:  X and Y
X-squared = 3.0236, df = 2, p-value = 0.2205

Deux variables quantitatives

  • Paramètres principaux
Y <- don$MORINF
X<-don$PIB
summary(X)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    757    2015    3290    5169    6437   19459       3 
summary(Y)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.20   32.70   42.10   45.32   59.40   84.50 
  • Graphique
plot(X,Y, xlab="PIB",ylab="Mortalité infantile")
text(X,Y,don$iso3,pos = 4,cex=0.6)

  • Test (Pearson)
cor.test(Y,X)

    Pearson's product-moment correlation

data:  Y and X
t = -3.2035, df = 44, p-value = 0.002526
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.6438911 -0.1654734
sample estimates:
       cor 
-0.4348812 

Une quantitative et une qualitative

  • Graphique
Y <- don$MORINF
X <- as.factor(don$LANGFR)
levels(X)<-c("non","oui")
plot(X,Y, 
     col=c("blue","red"),
     xlab ="Age médian",
     ylab = "Francophone",
     horizontal=T)

  • Test d’égalité des moyennes
t.test(Y~X)

    Welch Two Sample t-test

data:  Y by X
t = -0.67091, df = 43.675, p-value = 0.5058
alternative hypothesis: true difference in means between group non and group oui is not equal to 0
95 percent confidence interval:
 -13.891195   6.953484
sample estimates:
mean in group non mean in group oui 
         43.76296          47.23182 

En résumé

Nous avons survolé les principales fonctions élémentaires de R-Base pour montrer qu’il est facile et surtout rapide de les employer en lieu et place d’un tableur comme Excel ou d’un logiciel de statistique click-bouton.

Il reste encore beaucoup à apprendre mais à ce stade il est important de bien consolider les acquis et de connaître par coeur le nom des principales fonctions de base qui ont été présentées au cours de ce chapitre.

Vous allez donc reprendre l’ensemble de ce chapitre en utilisant un tableau complet comportant plus de pays et de variables.